package com.java.codesandbox.utils;


import cn.hutool.core.util.StrUtil;
import com.java.codesandbox.model.ExecuteMessage;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.StopWatch;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 进程工具类
 */
public class ProcessUtils {

    /**
     * 获取进程并获取输出信息
     * @param runProcess
     * @param opName
     * @return
     */
    public static ExecuteMessage runProcessGetMessage(Process runProcess,String opName ) {
        ExecuteMessage executeMessage = new ExecuteMessage();


        executeMessage.setErrorMessage("");

        try {

            StopWatch stopWatch = new StopWatch();

            stopWatch.start();
            int exitValue = runProcess.waitFor();
            executeMessage.setExitValue(exitValue);
            //正常退出
            if (exitValue == 0) {
                System.out.println(opName+"成功");
                //分批获取进程的正常输出
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(runProcess.getInputStream()));
                List<String> outputStrList = new ArrayList<>();

                //逐行读取
                String compileOutputLine;
                while ((compileOutputLine = bufferedReader.readLine()) != null) {
                    outputStrList.add(compileOutputLine);
                }
                executeMessage.setMessage(StringUtils.join(outputStrList,"\n"));
            } else {
                //异常退出
                System.out.println(opName+"失败,错误码： " + exitValue);
                //分批获取进程的正常输出
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(runProcess.getInputStream()));

                List<String> outputStrList = new ArrayList<>();

                //逐行读取
                String compileOutputLine;
                while ((compileOutputLine = bufferedReader.readLine()) != null) {
                    outputStrList.add(compileOutputLine);
                }
                executeMessage.setMessage(StringUtils.join(outputStrList,"\n"));

                //分批获取进程的错误输出
                BufferedReader errorBufferedReader = new BufferedReader(new InputStreamReader(runProcess.getErrorStream()));

                //逐行读取
                List<String> errorOutputStrList = new ArrayList<>();

                //逐行读取
                String errorCompileOutputLine;
                while ((errorCompileOutputLine = bufferedReader.readLine()) != null) {
                    errorOutputStrList.add(errorCompileOutputLine);
                }
                executeMessage.setErrorMessage(StringUtils.join(errorOutputStrList,"\n"));

            }
            stopWatch.stop();
            executeMessage.setTime(stopWatch.getTotalTimeMillis());
        }catch (Exception e){
            e.printStackTrace();
        }

        return executeMessage;
    }


    /**
     * 获取进程并获取输出信息
     * @param runProcess

     * @return
     */
    public static ExecuteMessage runInteractProcessGetMessage(Process runProcess,String args) {
        ExecuteMessage executeMessage = new ExecuteMessage();


        executeMessage.setErrorMessage("");

        try {
            //向控制台输出程序
            InputStream inputStream = runProcess.getInputStream();
            OutputStream outputStream = runProcess.getOutputStream();

            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);

            String[]s=args.split(" ");
            String join = StrUtil.join("\n",s)+"\n";

            outputStreamWriter.write(join);
            //相当于按了回车，执行输入的发送
            outputStreamWriter.flush();

            BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(runProcess.getInputStream()));

            StringBuilder compileOutStringBuilder = new StringBuilder();
            //逐行读取
            String compileOutputLine;
            while ((compileOutputLine = bufferedReader.readLine()) != null) {
                compileOutStringBuilder.append(compileOutputLine);
            }
            executeMessage.setMessage(compileOutStringBuilder.toString());

            //资源回收，否则会卡死
            outputStreamWriter.close();
            outputStream.close();
            inputStream.close();
            runProcess.destroy();
        }catch (Exception e){
            e.printStackTrace();
        }
        return executeMessage;
    }

}
